
/* eslint-disable */ 

/**
 * @file 定义一些操作vue组件的工具方法
 * @author hibincheng
 * @date 2017-06-06
 */


/**
 * 父子元素判断
 * @param {*} el  子元素
 * @param {*} parent  父元素
 * @param {*} ct  限定搜索在某元素窗器内
 */
let isParent = (el, parent, ct) => {
    let find = false;
    if (el === parent) {
        return true;
    }
    while (!find) {
        el = el.parentNode;

        if (!el) {
            break;
        }
        
        if (el === parent) {
            find = true;
        }
        
        if (el === document.body) { //到达根元素了
            break;
        }
        if (el === ct) { //到达容器就不再搜索了
            break;
        }
    }

    return find;
}

/**
 * 遍历组件
 * @param {*} vc 
 * @param {*} fn 
 */
export function traverseVC(vc, fn) {
    fn(vc);
    if (vc.$children && vc.$children.length) {
        vc.$children.forEach(function (item) {
            traverseVC(item, fn);
        });
    }
}

/**
 * 判断元素el是否为组件的ref
 * @param {*} el 
 * @param {*} refNames 
 * @param {*} pvc 
 */
export function isRefChild(el, refNames, pvc) {
    let find = false;
    if (!refNames) {
        traverseVC(pvc, (vc) => {
            for (let o in vc.$refs) {
                if (vc.$refs[o] === el) {
                    find = true;
                    break;
                }
            }
        });
    } else {
        refNames = typeof refNames === 'string' ? [refNames] : refNames;
        refNames.forEach((name) => {
            traverseVC(pvc, (vc) => {
                if (vc.$refs[name] === el) {
                    find = true;
                }
            });
        });
    }


    return find;
}

/**
 * 判断元素el是否为组件中ref的子元素
 * @param {*} el 
 * @param {*} refNames 
 * @param {*} pvc 
 */
export function inRefChild(el, refNames, pvc) {
    let find = false;
    refNames = typeof refNames === 'string' ? [refNames] : refNames;
    refNames.forEach((name) => {
        traverseVC(pvc, (vc) => {
            if (vc.$refs[name]) {
                let refs = vc.$refs[name];
                refs = refs.length ? refs : [refs];
                refs.forEach((item)=> {
                    if(isParent(el, (item.$el || item), pvc.$el)) {
                        find = true;
                    }
                });    
            }
        });
    });

    return find;
}

/**
 * 获取组件的ref
 * @param {*} refName 
 * @param {*} pvc 
 */
export function getRefChild(refName, pvc) {
    let child;
    traverseVC(pvc, (vc) => {
        if (vc.$refs[refName]) {
            child = vc.$refs[refName];
        }
    });

    return child;
}

/**
 * 获取元素的直接父组件
 * @param {*} el 
 */
export function getParentVC(el, pvc) {
    let retVC;
    traverseVC(pvc, (vc) => {
        if (isParent(el, vc.$el, pvc.$el)) { //找到一个不直接返回，直到找到直接父组件
            retVC = vc;
        }
    });
    return retVC;
}
